package cn.izeno.wx.service

import cn.izeno.wx.core.zzPart
import cn.izeno.wx.models.mp.JsTicket
import cn.izeno.wx.models.mp.Media
import cn.izeno.wx.models.mp.QrCodeParam
import cn.izeno.wx.models.mp.QrcodeTicket
import io.reactivex.rxjava3.core.Observable
import okhttp3.MultipartBody
import retrofit2.Call
import retrofit2.http.*
import java.io.File

/**
 * 微信公众号接口
 */
interface MpService {

  /**
   * 账号管理 | 生成带参数的二维码
   */
  @POST("https://api.weixin.qq.com/cgi-bin/qrcode/create")
  fun createRrCode(
      @Body body: QrCodeParam,
      @Query("access_token") token: String = body.token
  ): Observable<QrcodeTicket>


  /**
   * 账号管理 | 生成带参数的二维码
   */
  @POST("https://api.weixin.qq.com/cgi-bin/qrcode/create")
  fun createRrCodeSync(
      @Body body: QrCodeParam,
      @Query("access_token") token: String = body.token
  ): Call<QrcodeTicket>

  /**
   * js api ticket
   */
  @GET("https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi")
  fun jsTicket(@Query("access_token") token: String): Observable<JsTicket>

  /**
   * [新增临时素材](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726)
   *
   * 1. 临时素材media_id是可复用的。
   * 2. 媒体文件在微信后台保存时间为3天，即3天后media_id失效。
   * 3. 上传临时素材的格式、大小限制与公众平台官网一致。
   * - 图片（image）: 2M，支持PNG\JPEG\JPG\GIF格式
   * - 语音（voice）：2M，播放长度不超过60s，支持AMR\MP3格式
   * - 视频（video）：10MB，支持MP4格式
   * - 缩略图（thumb）：64KB，支持JPG格式
   *
   * @param file 需要上传的文件
   * @param type 媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）
   */
  @Multipart
  @POST("https://api.weixin.qq.com/cgi-bin/media/upload")
  fun uploadMedia(
      @Part("file") file: File,
      @Query("access_token") token: String,
      @Query("type") type: String = "image",
      @Part media: MultipartBody.Part = file.zzPart("media")
  ): Observable<Media>
}